/**
 * Copyright 2009-2010 by The Regents of the University of California
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * you may obtain a copy of the License from
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package edu.ucr.cs.dblab.acestore.base;

import java.io.IOException;
import java.util.Map;
import java.util.Vector;

/**
 * @author jarodwen
 * @created Jan 9, 2011
 */
public class LRUCacheAlgorithm implements ICacheAlgorithm {
	
	private Vector<ACEPageKey> keyList;
	
	private Map<ACEPageKey, ACEPage> bufferCache;
	
	public LRUCacheAlgorithm(){
		this.keyList = new Vector<ACEPageKey>();
	}
	
	public void setCache(Map<ACEPageKey, ACEPage> bufferCache){
		this.bufferCache = bufferCache;
	}

	/* (non-Javadoc)
	 * @see edu.ucr.cs.dblab.acestore.base.ICacheAlgorithm#readPage(int, int)
	 */
	@Override
	public void readPage(ACEPageKey key) {
		if(keyList.contains(key)){
			keyList.remove(key);
		}
		keyList.add(0, key);
	}

	/* (non-Javadoc)
	 * @see edu.ucr.cs.dblab.acestore.base.ICacheAlgorithm#writePage(int, int)
	 */
	@Override
	public void writePage(ACEPageKey key) {
		if(keyList.contains(key)){
			keyList.remove(key);
		}
		keyList.add(0, key);
	}

	/* (non-Javadoc)
	 * @see edu.ucr.cs.dblab.acestore.base.ICacheAlgorithm#swapPage()
	 */
	@Override
	public ACEPageKey swapPage() throws IOException {
		int i = keyList.size() - 1;
		while(i > 0 && bufferCache.get(keyList.get(i)).isPinned()){
			i--;
		}
		if(i < 0){
			throw new IOException("Failed to find a page to swap!");
		}else{
			return keyList.remove(i);
		}
	}

	@Override
	public void flush() {
		keyList = new Vector<ACEPageKey>();
	}

}
